/* * Copyright 2012-2014 Coronastreet Networks * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License */ package org.coronastreet.gpxconverter; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.border.EmptyBorder; import javax.swing.JOptionPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.JLabel; import javax.swing.JButton; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; public class AccountManager extends JFrame { static Logger log = Logger.getLogger(AccountManager.class); private static final long serialVersionUID = -3082970655365067290L; private JPanel frmAccounts; public JTextField strava_username; public JPasswordField strava_password; public JTextField rwgps_username; public JPasswordField rwgps_password; public JTextField garmin_username; public JPasswordField garmin_password; private static final char[] PASSWORD = "enfldsgbnlsngdlksdsgm".toCharArray(); private static final byte[] SALT = { (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, }; public AccountManager(MainWindow window) { setTitle("Account Settings"); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); setBounds(100, 100, 450, 199); frmAccounts = new JPanel(); frmAccounts.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(frmAccounts); frmAccounts.setLayout(null); JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); tabbedPane.setBounds(5, 5, 424, 118); frmAccounts.add(tabbedPane); JPanel stravaPanel = new JPanel(); stravaPanel.setLayout(null); tabbedPane.addTab("Strava", stravaPanel); strava_username = new JTextField(); strava_username.setBounds(79, 11, 235, 20); stravaPanel.add(strava_username); strava_username.setColumns(10); JLabel lblUsername = new JLabel("Username:"); lblUsername.setBounds(10, 14, 69, 14); stravaPanel.add(lblUsername); JLabel lblPassword = new JLabel("Password:"); lblPassword.setBounds(10, 45, 69, 14); stravaPanel.add(lblPassword); strava_password = new JPasswordField(); strava_password.setColumns(10); strava_password.setBounds(79, 42, 235, 20); stravaPanel.add(strava_password); JPanel rwgpsPanel = new JPanel(); rwgpsPanel.setLayout(null); tabbedPane.addTab("RideWithGPS", rwgpsPanel); JLabel label = new JLabel("Username:"); label.setBounds(10, 14, 69, 14); rwgpsPanel.add(label); rwgps_username = new JTextField(); rwgps_username.setColumns(10); rwgps_username.setBounds(79, 11, 235, 20); rwgpsPanel.add(rwgps_username); rwgps_password = new JPasswordField(); rwgps_password.setColumns(10); rwgps_password.setBounds(79, 42, 235, 20); rwgpsPanel.add(rwgps_password); JLabel label_1 = new JLabel("Password:"); label_1.setBounds(10, 45, 69, 14); rwgpsPanel.add(label_1); JPanel garminPanel = new JPanel(); garminPanel.setLayout(null); tabbedPane.addTab("Garmin Connect", garminPanel); JLabel label_2 = new JLabel("Username:"); label_2.setBounds(10, 14, 69, 14); garminPanel.add(label_2); garmin_username = new JTextField(); garmin_username.setColumns(10); garmin_username.setBounds(79, 11, 235, 20); garminPanel.add(garmin_username); garmin_password = new JPasswordField(); garmin_password.setColumns(10); garmin_password.setBounds(79, 42, 235, 20); garminPanel.add(garmin_password); JLabel label_3 = new JLabel("Password:"); label_3.setBounds(10, 45, 69, 14); garminPanel.add(label_3); loadAccountPrefs(); JButton btnSave = new JButton("SAVE"); btnSave.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { saveAccountInfo(); } }); btnSave.setBounds(106, 127, 89, 23); frmAccounts.add(btnSave); JButton btnCancel = new JButton("CANCEL"); btnCancel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { cancel(); } }); btnCancel.setBounds(242, 127, 89, 23); frmAccounts.add(btnCancel); } private void saveAccountInfo() { GPXConverter.setPref("strava_username", strava_username.getText()); GPXConverter.setPref("rwgps_username", rwgps_username.getText()); GPXConverter.setPref("garmin_username", garmin_username.getText()); try { GPXConverter.setPref("strava_password", encrypt(String.valueOf(strava_password.getPassword()))); } catch (Exception e) { // Error with saving the password, let's wipe it and throw an error. GPXConverter.delPref("strava_password"); JOptionPane.showMessageDialog(this, "Strava Password Encryption failed Please try again or restart the program.", "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE); } try { GPXConverter.setPref("rwgps_password", encrypt(String.valueOf(rwgps_password.getPassword()))); } catch (Exception e) { // Error with saving the password, let's wipe it and throw an error. GPXConverter.delPref("rwgps_password"); JOptionPane.showMessageDialog(this, "RideWithGPS Password Encryption failed Please try again or restart the program.", "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE); } try { GPXConverter.setPref("garmin_password", encrypt(String.valueOf(garmin_password.getPassword()))); } catch (Exception e) { // Error with saving the password, let's wipe it and throw an error. GPXConverter.delPref("garmin_password"); JOptionPane.showMessageDialog(this, "Garmin Password Encryption failed Please try again or restart the program.", "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE); } this.setVisible(false); } private void cancel() { // Populate stuff with old values... loadAccountPrefs(); this.setVisible(false); } private void loadAccountPrefs() { strava_username.setText(GPXConverter.getPref("strava_username")); rwgps_username.setText(GPXConverter.getPref("rwgps_username")); garmin_username.setText(GPXConverter.getPref("garmin_username")); try { strava_password.setText(decrypt(GPXConverter.getPref("strava_password"))); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Loading Strava Encrypted Password failed. Please check the Strava password and try saving it again.", "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE); } try { rwgps_password.setText(decrypt(GPXConverter.getPref("rwgps_password"))); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Loading RideWithGPS Encrypted Password failed. Please check the RideWithGPS password and try saving it again.", "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE); } try { garmin_password.setText(decrypt(GPXConverter.getPref("garmin_password"))); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Loading Garmin Encrypted Password failed. Please check the Garmin password and try saving it again.", "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE); } } public static String encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8"))); } private static String base64Encode(byte[] bytes) { // NB: This class is internal, and you probably should use another impl return Base64.encodeBase64String(bytes); } public static String decrypt(String property) throws GeneralSecurityException, IOException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8"); } private static byte[] base64Decode(String property) throws IOException { // NB: This class is internal, and you probably should use another impl return Base64.decodeBase64(property); } }